//TODO 泛型接口:在定义接口时, 为接口中的属性或方法定义泛型类型
// 在使用接口时, 再指定具体的泛型类型
/*TODO
*  需求:定义一个类,用来存储用户的相关信息(id,name,age)
*  通过一个类的实例对象调用add方法可以添加多个用户信息对象,调用getUserId方法可以更具id获取某个指定的用户信息 */

(()=>{
    //定义一个泛型接口
    interface IBaseCRUD<T>{
        data:Array<T>
        add:(user:T)=>T
        getUserId:(id:number)=>T
    }


//定义一个用户的信息类
    class User {
        id?:number//表示该属性可有可无
        name:string
        age:number

        //构造函数
        constructor(name:string,age:number) {
            this.name=name
            this.age=age
        }
    }

    //定义一个类,可以针对用户的信息对象进行增加和查询的操作
    class UserCRUD implements IBaseCRUD<User>{
        //用来保存多个User类型的用户对象
        data:Array<User>=[]
        //存储用户信息对象的
        add(user:User):User{
            user.id=Date.now()+Math.random()
            this.data.push(user)
            return user
        }
        //根据id查询指定用户信息对象
        getUserId(id:number):User{
        // @ts-ignore
            return this.data.find(user=>user.id===id)
        }
    }


    //实例化添加用户信息对象的UserCRUD
    const userCRUD = new UserCRUD()
    userCRUD.add(new User('Jack',20))
    userCRUD.add(new User('TOM',25))
    userCRUD.add(new User('Lucky',23))
    console.log(userCRUD.data)

    const {id} = userCRUD.add(new User('Lucy',10))
// @ts-ignore
    const user = userCRUD.getUserId(id)
    console.log(user)
})()
